package gui.standard.form;

import java.math.BigDecimal;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import model.tablemodel.StavkaPrometnogDokumentaTableModel;
import net.miginfocom.swing.MigLayout;
import util.components.JDecimalTextField;
import util.components.JDigitsTextField;
import util.components.JIznosTextField;
import util.components.JLimitedTextField;
import util.exceptions.NegativeValueException;
import actions.standard.form.ZoomFormAction;

public class StavkaPrometnogDokumentaForm extends StandardForm {

	private static final long serialVersionUID = 1L;
	private JLimitedTextField tfSifraPreduzeca;
	private JDigitsTextField tfPoslovnaGodina;
	private JDigitsTextField tfBrojPrometnogDok;
	private JTextField tfDatumNastankaPrometnogDok;
	private JDigitsTextField tfRedniBrojStPromDok;
	private JLimitedTextField tfSifraGrupe;
	private JDigitsTextField tfSifraArtikla;
	private JDecimalTextField tfKolicina;
	private JIznosTextField tfCena;
	private JIznosTextField tfVrednost;

	private JButton bPrometniDokumentZoom;
	private JButton bArtikalZoom;

	public StavkaPrometnogDokumentaForm() {

	}
	
	@Override
	public void init(){
		
		super.init();
		
		tfSifraPreduzeca = new JLimitedTextField(12, 12, true);
		tfPoslovnaGodina = new JDigitsTextField(4, 4, false, false);
		tfBrojPrometnogDok = new JDigitsTextField(10, 10, true, true);
		tfDatumNastankaPrometnogDok = new JTextField(12);
		tfRedniBrojStPromDok = new JDigitsTextField(10, 10, true, false);
		tfSifraGrupe = new JLimitedTextField(12, 12, true);
		tfSifraArtikla = new JDigitsTextField(12, 12, true, true);
		tfKolicina = new JDecimalTextField(13, 12, 2, ',', true);
		tfCena = new JIznosTextField(12, 12, 2, false);
		tfVrednost = new JIznosTextField(12, 12, 2, false);
		
		tfVrednost.setEditable(false);
		
		tfKolicina.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void insertUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
			}
		});
		
		tfCena.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void insertUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
			}
		});
		
		setTitle("Stavka prometnog dokumenta");
		
		tableModel = new StavkaPrometnogDokumentaTableModel(
				new String[] { "Sifra preduzeca", "Poslovna godina",
						"Broj prometnog dok.", "Datum nastanka prometnog dok.",
						"Redni broj st. prom. dok.", "Sifra grupe",
						"Sifra Artikla", "Kolicina", "Cena", "Vrednost" }, 0);

		tblGrid.setModel(tableModel);
		
		bPrometniDokumentZoom = new JButton(new ZoomFormAction(
				this, new PrometniDokumentForm()));
		bArtikalZoom = new JButton(new ZoomFormAction(this,
				new ArtikalForm()));
		
		children.add(new AnalitikaMagacinskeKarticeForm());
		
		JPanel bottomPanel = new JPanel();
		bottomPanel.setLayout(new MigLayout("fillx"));
		JPanel dataPanel = new JPanel();
		dataPanel.setLayout(new MigLayout("gapx 15px"));

		JLabel lblSifraPreduzeca = new JLabel("Sifra preduzeca:");
		JLabel lblPoslovnaGodina = new JLabel("Poslovna godina:");
		JLabel lblBrojPrometnogDok = new JLabel("Broj prometnog dok.:");
		JLabel lblDatumNastankaPrometnogDok = new JLabel(
				"Datum nastanka prometnog dok.:");
		JLabel lblRedniBrojStPromDok = new JLabel("Redni broj st. prom. dok:");
		JLabel lblSifraGrupe = new JLabel("Sifra grupe:");
		JLabel lblSifraArtikla = new JLabel("Sifra artikla:");
		JLabel lblKolicina = new JLabel("Kolicina:");
		JLabel lblCena = new JLabel("Cena:");
		JLabel lblVrednost = new JLabel("Vrednost:");

		dataPanel.add(lblSifraPreduzeca);
		dataPanel.add(tfSifraPreduzeca);
		dataPanel.add(bPrometniDokumentZoom, "wrap");
		dataPanel.add(lblPoslovnaGodina);
		dataPanel.add(tfPoslovnaGodina, "pushx");
		dataPanel.add(lblBrojPrometnogDok);
		dataPanel.add(tfBrojPrometnogDok, "wrap");
		dataPanel.add(lblDatumNastankaPrometnogDok);
		dataPanel.add(tfDatumNastankaPrometnogDok, "pushx");
		dataPanel.add(lblRedniBrojStPromDok);
		dataPanel.add(tfRedniBrojStPromDok, "wrap");
		dataPanel.add(lblSifraGrupe);
		dataPanel.add(tfSifraGrupe, "pushx");
		dataPanel.add(lblSifraArtikla);
		dataPanel.add(tfSifraArtikla);
		dataPanel.add(bArtikalZoom, "wrap");
		dataPanel.add(lblKolicina);
		dataPanel.add(tfKolicina, "pushx");
		dataPanel.add(lblCena);
		dataPanel.add(tfCena, "wrap");
		dataPanel.add(lblVrednost);
		dataPanel.add(tfVrednost, "pushx");
		bottomPanel.add(dataPanel);

		bottomPanel.add(buttonsPanel, "dock east");

		add(bottomPanel, "grow, wrap");
	}

	@Override
	public void sync() {
		// TODO Auto-generated method stub
		int index = tblGrid.getSelectedRow();
		if (index < 0) {
			tfSifraPreduzeca.setText("");
			tfPoslovnaGodina.setText("");
			tfBrojPrometnogDok.setText("");
			tfDatumNastankaPrometnogDok.setText("");
			tfRedniBrojStPromDok.setText("");
			tfSifraGrupe.setText("");
			tfSifraArtikla.setText("");
			tfKolicina.setText("");
			tfCena.setText("");
			tfVrednost.setText("");
			return;
		}
		String sifraPreduzeca = (String) tableModel.getValueAt(index, 0);
		String poslovnaGodina = (String) tableModel.getValueAt(index, 1);
		String brojPrometnogDok = (String) tableModel.getValueAt(index, 2);
		String datumNastankaPrometnogDok = (String) tableModel.getValueAt(
				index, 3);
		String redniBrojStPromDok = (String) tableModel.getValueAt(index, 4);
		String sifraGrupe = (String) tableModel.getValueAt(index, 5);
		String sifraArtikla = (String) tableModel.getValueAt(index, 6);
		String kolicina = (String) tableModel.getValueAt(index, 7);
		String cena = (String) tableModel.getValueAt(index, 8);
		String vrednost = (String) tableModel.getValueAt(index, 9);
		
		kolicina = kolicina.replace(',', '.');
		
		double dkolicina = Double.parseDouble(kolicina);
		
		BigDecimal bdCena = new BigDecimal(cena);
		BigDecimal bdVrednost = new BigDecimal(vrednost);

		tfSifraPreduzeca.setText(sifraPreduzeca);
		tfPoslovnaGodina.setText(poslovnaGodina);
		tfBrojPrometnogDok.setText(brojPrometnogDok);
		tfDatumNastankaPrometnogDok.setText(datumNastankaPrometnogDok);
		tfRedniBrojStPromDok.setText(redniBrojStPromDok);
		tfSifraGrupe.setText(sifraGrupe);
		tfSifraArtikla.setText(sifraArtikla);
		tfKolicina.setValue(dkolicina);
		try {
			tfCena.setValue(bdCena);
		} catch (NegativeValueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			tfVrednost.setValue(bdVrednost);
		} catch (NegativeValueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		setMode(StandardForm.MODE_EDIT);

	}

	@Override
	public void addRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBrojStPromDok = tfRedniBrojStPromDok.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikla.getText().trim();
		String kolicina = tfKolicina.getText().trim();
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		try {
			int index = tableModel.insertRow(new String[] { sifraPreduzeca,
					poslovnaGodina, brojPrometnogDok,
					datumNastankaPrometnogDok, redniBrojStPromDok, sifraGrupe,
					sifraArtikla, kolicina, cena, vrednost });
			tblGrid.setRowSelectionInterval(index, index);
			setMode(MODE_ADD);
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	@Override
	public void searchRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBrojStPromDok = tfRedniBrojStPromDok.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikla.getText().trim();
		String kolicina = tfKolicina.getText().trim();
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		try {
			tableModel.searchRows(new String[] { sifraPreduzeca,
					poslovnaGodina, brojPrometnogDok,
					datumNastankaPrometnogDok, redniBrojStPromDok, sifraGrupe,
					sifraArtikla, kolicina, cena, vrednost });
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	@Override
	public void editRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBrojStPromDok = tfRedniBrojStPromDok.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikla.getText().trim();
		String kolicina = tfKolicina.getText().trim();
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		try {
			int index = tableModel.editRow(new String[] { sifraPreduzeca,
					poslovnaGodina, brojPrometnogDok,
					datumNastankaPrometnogDok, redniBrojStPromDok, sifraGrupe,
					sifraArtikla, kolicina, cena, vrednost },
					tblGrid.getSelectedRow());
			tblGrid.setRowSelectionInterval(index, index);
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	@Override
	public void setMode(int mode) {
		super.setMode(mode);

		if (mode != StandardForm.MODE_ADD)
			return;

		tfSifraPreduzeca.setText("");
		tfPoslovnaGodina.setText("");
		tfBrojPrometnogDok.setText("");
		tfDatumNastankaPrometnogDok.setText("");
		tfRedniBrojStPromDok.setText("");
		tfSifraGrupe.setText("");
		tfSifraArtikla.setText("");
		tfKolicina.setText("");
		tfCena.setText("");
		tfVrednost.setText("");
	}

	@Override
	public String[] getSelectedRowKeys() {
		// TODO Auto-generated method stub
		return new String[]{tfSifraPreduzeca.getText().trim(), tfPoslovnaGodina.getText().trim(), tfBrojPrometnogDok.getText().trim(), 
				tfDatumNastankaPrometnogDok.getText().trim(), tfRedniBrojStPromDok.getText().trim()};
	}

	@Override
	public void getZoomedCol(String[] keys, StandardForm form) {
		// TODO Auto-generated method stub
		if(form instanceof ArtikalForm){
			tfSifraGrupe.setText(keys[0]);
			tfSifraArtikla.setText(keys[1]);
		}else if(form instanceof PrometniDokumentForm){
			tfPoslovnaGodina.setText(keys[0]);
			tfSifraPreduzeca.setText(keys[1]);
			tfBrojPrometnogDok.setText(keys[2]);
			tfDatumNastankaPrometnogDok.setText(keys[3]);
		}
	}

	@Override
	public String[] getSelectedRowNextKeys(int index) {
		// TODO Auto-generated method stub
		return new String[]{tfSifraPreduzeca.getText().trim(), "", "", "", "", tfPoslovnaGodina.getText().trim(), "", 
				tfBrojPrometnogDok.getText().trim(), tfDatumNastankaPrometnogDok.getText().trim(), 
				tfRedniBrojStPromDok.getText().trim(), "", "", "", "", "", "", ""};
	}

}
